OpenTelemetry WebServer module
OpenTelemetryのNginxとApache向けモジュールをビルドできるSDKがGitHubで配布されている。
2022/11/08時点の最新は webserver/v1.0.2 (2022/10/11リリース)。
https://github.com/open-telemetry/opentelemetry-cpp-contrib/tree/main/instrumentation/otel-webserver-module
Nginx Webserver Module also enables tracing of incoming requests to the server by injecting instrumentation into the Nginx server at runtime. It also captures the response time of the individual modules involved in the request processing.
Apache と同様に、Nginx ウェブサーバモジュールでも、ランタイムに Nginx サーバにインスツルメンテーションを注入することにより、サーバへの着信リクエストのトレースが可能です。また、リクエスト処理に関わる個々のモジュールのレスポンスタイムを取得することもできます。 (DeepL.comで翻訳)
shimizukawa.iconNginx自体のTRACE, SPANを細かく集めたいのであればこのモジュールが良いのかも。そうでなければ、 OpenTelemetry nginx moduleを使った方がよいと思う。
nginxモジュール(.so)は自分でビルドする必要がある。
上記ページにビルド方法も書かれているが、Dockerfileを用意すれば簡単にビルドできる。
https://opentelemetry.io/blog/2022/instrument-nginx/ に書かれている。
code:Dockerfile.original (Dockerfile)
FROM nginx:1.18
RUN apt-get update ; apt-get install unzip
ADD https://github.com/open-telemetry/opentelemetry-cpp-contrib/releases/download/webserver%2Fv1.0.0/opentelemetry-webserver-sdk-x64-linux.tgz.zip /opt
RUN cd /opt ; unzip opentelemetry-webserver-sdk-x64-linux.tgz.zip; tar xvfz opentelemetry-webserver-sdk-x64-linux.tgz
RUN cd /opt/opentelemetry-webserver-sdk; ./install.sh
ENV LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/opentelemetry-webserver-sdk/sdk_lib/lib
RUN echo "load_module /opt/opentelemetry-webserver-sdk/WebServerModule/Nginx/ngx_http_opentelemetry_module.so;\n$(cat /etc/nginx/nginx.conf)" > /etc/nginx/nginx.conf
COPY opentelemetry_module.conf /etc/nginx/conf.d
sdkのリリースバージョンとNginxのバージョンが関連しているので、以下のDockerfileで複数のNginxバージョンに対応させてみた。
code:Dockefile.multi (Dockerfile)
# supports: Nginx 1.18, 1.22.0, 1.23.1
ARG VARIANT=1.18
FROM nginx:1.18 AS nginx-1.18
ADD https://github.com/open-telemetry/opentelemetry-cpp-contrib/releases/download/webserver%2Fv1.0.1/opentelemetry-webserver-sdk-x64-linux.tgz /opt
RUN echo "load_module /opt/opentelemetry-webserver-sdk/WebServerModule/Nginx/ngx_http_opentelemetry_module.so;\n$(cat /etc/nginx/nginx.conf)" > /etc/nginx/nginx.conf
FROM nginx:1.22.0 AS nginx-1.22.0
ADD https://github.com/open-telemetry/opentelemetry-cpp-contrib/releases/download/webserver%2Fv1.0.2/opentelemetry-webserver-sdk-x64-linux.tgz.zip /opt
RUN echo "load_module /opt/opentelemetry-webserver-sdk/WebServerModule/Nginx/1.22.0/ngx_http_opentelemetry_module.so;\n$(cat /etc/nginx/nginx.conf)" > /etc/nginx/nginx.conf
FROM nginx:1.23.1 AS nginx-1.23.1
ADD https://github.com/open-telemetry/opentelemetry-cpp-contrib/releases/download/webserver%2Fv1.0.2/opentelemetry-webserver-sdk-x64-linux.tgz.zip /opt
RUN echo "load_module /opt/opentelemetry-webserver-sdk/WebServerModule/Nginx/1.23.1/ngx_http_opentelemetry_module.so;\n$(cat /etc/nginx/nginx.conf)" > /etc/nginx/nginx.conf
FROM nginx-${VARIANT}
RUN apt-get update ; apt-get install unzip
RUN cd /opt ; \
unzip opentelemetry-webserver-sdk-x64-linux.tgz.zip; \
tar xvfz opentelemetry-webserver-sdk-x64-linux.tgz
RUN cd /opt/opentelemetry-webserver-sdk; \
./install.sh
ENV LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/opentelemetry-webserver-sdk/sdk_lib/lib
COPY opentelemetry_module.conf /etc/nginx/conf.d
ビルド
code:bash
$ docker build -t nginx-otel --build-arg VARIANT=1.22.0
Uptraceでの見え方
https://scrapbox.io/files/63696ddd289685001da5ad7c.png